﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Diagnostics;

namespace Player
{
    public class RegistrySchema
    {
        public static readonly string PRODUCT_NAME = "DirectAudit";
        public static readonly string DIRECT_AUDIT_KEY = Path.Combine(CentrifyCommonSettings.COMPANY_NAME, PRODUCT_NAME);
        public static readonly string DIRECT_AUDIT_REG_KEY = Path.Combine(CentrifyCommonSettings.SOFTWARE, DIRECT_AUDIT_KEY);
        public static readonly string DIRECT_AUDIT_POLICIES_REG_KEY = Path.Combine(CentrifyCommonSettings.POLICIES, DIRECT_AUDIT_KEY);

        public class Collector
        {
            public static readonly string COLLECTOR_NAME = "Collector";

            public static readonly string COLLECTOR_KEY = Path.Combine(PRODUCT_NAME, COLLECTOR_NAME);

            public static readonly string COLLECTOR_REG_KEY = Path.Combine(DIRECT_AUDIT_REG_KEY, COLLECTOR_NAME);

            public static readonly string INSTALLATION_ID = "InstallationId";
            public static readonly string INSTALLATION_ID_DEFAULT = string.Empty;
            public static readonly bool INSTALLATION_ID_GP = false;

            public static readonly string PORT_NUMBER = "Port";
            public static readonly int PORT_NUMBER_DEFAULT = 5063;
            public static readonly bool PORT_NUMBER_GP = false;

            public static readonly string LOG_LEVEL = "LogLevel";
            public static readonly bool LOG_LEVEL_GP = true;
#if DEBUG || TESTBED
            public static readonly string LOG_LEVEL_DEFAULT = "Verbose";
#else
            public static readonly string LOG_LEVEL_DEFAULT = "Information";
#endif

            public static readonly string STATUS_UPDATE_INTERVAL = "StatusUpdateInterval"; // in seconds
            public static readonly int STATUS_UPDATE_INTERVAL_DEFAULT = 60;
            public static readonly bool STATUS_UPDATE_INTERVAL_GP = true;

            public static readonly string USE_SQL_AUTHEN = "UseSqlAuthentication";
            public static readonly bool USE_SQL_AUTHEN_GP = false;
            public static readonly bool USE_SQL_AUTHEN_DEFAULT = false;
            public static readonly string SQL_AUTHEN_KEY = Path.Combine(COLLECTOR_KEY, "SqlAuthentication");

            public static readonly string SQL_USERNAME = "SqlUsername";
            public static readonly bool SQL_USERNAME_GP = false;

            public static readonly string SQL_PASSWORD = "SqlPassword";
            public static readonly bool SQL_PASSWORD_GP = false;

            public static readonly string SESSION_STALE_MINUTES = "SessionStaleMinutes";
            public static readonly int SESSION_STALE_MINUTES_DEFAULT = 5;
            public static readonly bool SESSION_STALE_MINUTES_GP = true;

            public static readonly string UNIX_FRAME_RATE = "UnixFrameRate";
            public static readonly int UNIX_FRAME_RATE_DEFAULT = 1000;
            public static readonly bool UNIX_FRAME_RATE_GP = true;

            public static readonly string SNAPSHOT_MAX_SIZE = "UnixFrameRate";
            public static readonly int SNAPSHOT_MAX_SIZE_DEFAULT = 500000;
            public static readonly bool SNAPSHOT_MAX_SIZE_GP = true;

            /// <summary>
            ///  Padded length of user or client machine name to be inserted into database table before Collector resolves the name.
            /// </summary>
            public static readonly string RESOLVED_NAME_PAD_LENGTH = "ResolvedNamePadLength";
            public static readonly int RESOLVED_NAME_PAD_LENGTH_DEFAULT = 64;
            public static readonly bool RESOLVED_NAME_PAD_LENGTH_GP = true;

            public static readonly string CURRENT_STATE = "CurrentState";
            public static readonly bool CURRENT_STATE_GP = false;
            public static readonly int CURRENT_STATE_DEFAULT = 0;

            public static readonly string CURRENT_STATE_DESCRIPTION = "CurrentStateDescription";
            public static readonly bool CURRENT_STATE_DESCRIPTION_GP = false;
            public static readonly string CURRENT_STATE_DESCRIPTION_DEFAULT = string.Empty;

            public static readonly string CURRENT_INSTALLATION_SECURED = "CurrentInstallationSecured";
            public static readonly bool CURRENT_INSTALLATION_SECURED_DEFAULT = false;
            public static readonly bool CURRENT_INSTALLATION_SECURED_GP = false;

            public static readonly string CURRENT_INSTALLATION = "CurrentInstallation";
            public static readonly bool CURRENT_INSTALLATION_GP = false;
            public static readonly string CURRENT_INSTALLATION_DEFAULT = string.Empty;

            public static readonly string CURRENT_AUDITSTORE = "CurrentAuditStore";
            public static readonly bool CURRENT_AUDITSTORE_GP = false;
            public static readonly string CURRENT_AUDITSTORE_DEFAULT = string.Empty;

            public static readonly string CURRENT_DATABASE = "CurrentDatabase";
            public static readonly bool CURRENT_DATABASE_GP = false;
            public static readonly string CURRENT_DATABASE_DEFAULT = string.Empty;

            public static readonly string CURRENT_PORT_NUMBER = "CurrentPortNumber";
            public static readonly int CURRENT_PORT_NUMBER_DEFAULT = 0;
            public static readonly bool CURRENT_PORT_NUMBER_GP = false;

            public static readonly int COMPRESSION_LEVEL_DEFAULT = 6;
#if DEBUG || TESTBED
            public static readonly string COMPRESSION_LEVEL = "CompressionLevel";
            public static readonly bool COMPRESSION_LEVEL_GP = true;
#endif

            public static readonly int QUEUE_CAPACITY_DEFAULT = 10;
#if DEBUG || TESTBED
            public static readonly string QUEUE_CAPACITY = "QueueCapacity";
            public static readonly bool QUEUE_CAPACITY_GP = true;
#endif

            public static readonly bool WDAD_COMPRESSION_DEFAULT = true;
#if DEBUG || TESTBED
            public static readonly string WDAD_COMPRESSION = "WdadCompression";
            public static readonly bool WDAD_COMPRESSION_GP = true;
#endif

            public static readonly int INITIALIZATION_INTERVAL_DEFAULT = 5; // seconds
#if DEBUG || TESTBED
            public static readonly string INITIALIZATION_INTERVAL = "InitializationInterval";
            public static readonly bool INITIALIZATION_INTERVAL_GP = true;
#endif

            public static readonly int UPDATE_CONFIGURATION_INTERVAL_DEFAULT = 29; // seconds
#if DEBUG || TESTBED
            public static readonly string UPDATE_CONFIGURATION_INTERVAL = "UpdateConfigurationInterval";
            public static readonly bool UPDATE_CONFIGURATION_INTERVAL_GP = true;
#endif

            public static readonly int SHORT_RETRY_INTERVAL_DEFAULT = 10; // seconds
#if DEBUG || TESTBED
            public static readonly string SHORT_RETRY_INTERVAL = "ShortRetryInterval";
            public static readonly bool SHORT_RETRY_INTERVAL_GP = true;
#endif
        }

        public class Agent
        {
            public static readonly string AGENT_NAME = "Agent";

            public static readonly string AGENT_KEY = Path.Combine(PRODUCT_NAME, AGENT_NAME);

            public static readonly string AGENT_REG_KEY = Path.Combine(DIRECT_AUDIT_REG_KEY, AGENT_NAME);

            public static readonly string AGENT_POLICIES_REG_KEY = Path.Combine(DIRECT_AUDIT_POLICIES_REG_KEY,
                                                                                AGENT_NAME);

            public static readonly string INSTALLATION_ID = "InstallationId";
            public static readonly string INSTALLATION_ID_DEFAULT = string.Empty;
            public static readonly bool INSTALLATION_ID_GP = false;

            public static readonly string MAX_FORMAT = "MaxFormat";
            public static readonly CaptureContract.PixelFormat MAX_FORMAT_DEFAULT = CaptureContract.PixelFormat.Raw4Byte888;
            public static readonly bool MAX_FORMAT_GP = true;

            public static readonly string SPOOL_DIR = "SpoolDir";
            public static readonly string SPOOL_DIR_DEFAULT = Path.Combine(
                Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData),
                "Centrify\\DirectAudit\\Spool");
#if DEBUG || TESTBED
            public static readonly bool SPOOL_DIR_GP = true;
#else
            public static readonly bool   SPOOL_DIR_GP = false;
#endif

            public static readonly string LOG_LEVEL = "LogLevel";
            public static readonly string LOG_LEVEL_DEFAULT = "Off";
            public static readonly bool LOG_LEVEL_GP = false;

            public static readonly string AUDIT_LIST = "AuditList";
            public static readonly bool AUDIT_LIST_GP = true;
            public static readonly string AUDIT_LIST_DEFAULT = null;

            public static readonly string NO_AUDIT_LIST = "NoAuditList";
            public static readonly bool NO_AUDIT_LIST_GP = true;
            public static readonly string NO_AUDIT_LIST_DEFAULT = null;

            public static readonly string DISK_CHECK_INTERVAL = "DiskCheckInterval";
            public static readonly int DISK_CHECK_INTERVAL_DEFAULT = 15; // seconds
            public static readonly bool DISK_CHECK_INTERVAL_GP = true;

            public static readonly string DISK_CHECK_THRESHOLD = "DiskCheckThreshold";
            public static readonly int DISK_CHECK_THRESHOLD_DEFAULT = 10; // percentage of free disk needed on spool partition.
            public static readonly bool DISK_CHECK_THRESHOLD_GP = true;

            public static readonly string WASH_SCREEN_SAVER_TIMEOUT = "WashScreenSaverTimeout";
            public static readonly int WASH_SCREEN_SAVER_TIMEOUT_DEFAULT = 15; // seconds
            public static readonly bool WASH_SCREEN_SAVER_TIMEOUT_GP = true;

            public static readonly string WASH_SCREEN_SAVER_DISMISSED_TIMER = "ScreensaverDismissedTimer";
            public static readonly int WASH_SCREEN_SAVER_DISMISSED_TIMER_DEFAULT = 5;   // seconds
            public static readonly bool WASH_SCREEN_SAVER_DISMISSED_TIMER_GP = true;

            public static readonly string WASH_MSG_QUEUE_THRESHOLD = "WashMsgQueueThreshold";
            public static readonly int WASH_MSG_QUEUE_THRESHOLD_DEFAULT = 65000;
            public static readonly bool WASH_MSG_QUEUE_THRESHOLD_GP = true;

            public static readonly string WASH_FILTER_LARGE_RECTS = "WashFilterLargeRects";
            public static readonly bool WASH_FILTER_LARGE_RECTS_GP = true;
            public static readonly bool WASH_FILTER_LARGE_RECTS_DEFAULT = WindowsApi.isWindowsXP;

            public static readonly string WASH_MEM_SEGMENTS = "WashMemSegments";
            public static readonly bool WASH_MEM_SEGMENTS_GP = true;
            public static readonly int WASH_MEM_SEGMENTS_DEFAULT = (WindowsApi.isWindowsXP ? 1 : 8);

            public static readonly string WASH_USE_CAPTUREBLT = "WashUseCaptureBlt";
            public static readonly bool WASH_USE_CAPTUREBLT_GP = true;
            public static readonly bool WASH_USE_CAPTUREBLT_DEFAULT = true;

            public static readonly string FORCE_REBIND_INTERVAL = "ForceRebindInterval";
            public static readonly bool FORCE_REBIND_INTERVAL_GP = true;
            public static readonly int FORCE_REBIND_INTERVAL_DEFAULT = 120; // minutes

            public static readonly string RECONFIGURE_INTERVAL = "ReconfigureInterval"; // for wdad.  seconds.
            public static readonly int RECONFIGURE_INTERVAL_DEFAULT = 30;
            public static readonly bool RECONFIGURE_INTERVAL_GP = true;

            public static readonly string SESSION_PING_INTERVAL = "SessionPingInterval"; // for wdad.  seconds.
            public static readonly int SESSION_PING_INTERVAL_DEFAULT = 60;
            public static readonly bool SESSION_PING_INTERVAL_GP = true;

            public static readonly string AUDIT_SESSION_POLL_INTERVAL = "AuditSessionPollInterval"; // for wdad. seconds.
            public static readonly int AUDIT_SESSION_POLL_INTERVAL_DEFAULT = 5;                  // default 5 seconds
            public static readonly bool AUDIT_SESSION_POLL_INTERVAL_GP = true;

            public static readonly string READ_TIMEOUT = "ReadTimeout"; // for communication to collector.  seconds.
            public static readonly int READ_TIMEOUT_DEFAULT = 60;
            public static readonly bool READ_TIMEOUT_GP = true;

            public static readonly string CURRENT_STATE = "CurrentState";
            public static readonly bool CURRENT_STATE_GP = false;
            public static readonly int CURRENT_STATE_DEFAULT = 0;

            public static readonly string CURRENT_STATE_DESCRIPTION = "CurrentStateDescription";
            public static readonly bool CURRENT_STATE_DESCRIPTION_GP = false;
            public static readonly string CURRENT_STATE_DESCRIPTION_DEFAULT = string.Empty;

            public static readonly string CURRENT_INSTALLATION_SECURED = "CurrentInstallationSecured";
            public static readonly bool CURRENT_INSTALLATION_SECURED_DEFAULT = false;
            public static readonly bool CURRENT_INSTALLATION_SECURED_GP = false;

            public static readonly string CURRENT_INSTALLATION = "CurrentInstallation";
            public static readonly string CURRENT_INSTALLATION_DEFAULT = string.Empty;
            public static readonly bool CURRENT_INSTALLATION_GP = false;

            public static readonly string CURRENT_AUDIT_STORE = "CurrentAuditStore";
            public static readonly string CURRENT_AUDIT_STORE_DEFAULT = string.Empty;
            public static readonly bool CURRENT_AUDIT_STORE_GP = false;

            public static readonly string CURRENT_COLLECTOR = "CurrentCollector";
            public static readonly string CURRENT_COLLECTOR_DEFAULT = string.Empty;
            public static readonly bool CURRENT_COLLECTOR_GP = false;

            // Used right now to flip between hooking and polling for mouse activity
            //  its unclear which is best at the moment (profiling necessary).  Set to
            //  true to hook the mouse, false to use polling.  
            public static readonly bool WASH_HOOK_MOUSE_DEFAULT = false;
#if DEBUG || TESTBED
            public static readonly string WASH_HOOK_MOUSE = "WashHookMouse";
            public static readonly bool WASH_HOOK_MOUSE_GP = true;
#endif

            public static readonly int WASH_STEW_INTERVAL_DEFAULT = 15;
#if DEBUG || TESTBED
            public static readonly string WASH_STEW_INTERVAL = "WashStewInterval";
            public static readonly bool WASH_STEW_INTERVAL_GP = true;
#endif

            public static readonly bool WASH_STEW_CURSOR_DEFAULT = true;
#if DEBUG || TESTBED
            public static readonly string WASH_STEW_CURSOR = "WashStewCursor";
            public static readonly bool WASH_STEW_CURSOR_GP = true;
#endif

            public static readonly bool WASH_CAPTURE_EVENTS_DEFAULT = true;
#if DEBUG || TESTBED
            public static readonly string WASH_CAPTURE_EVENTS = "WashCaptureEvents";
            public static readonly bool WASH_CAPTURE_EVENTS_GP = true;
#endif

            public static readonly int WASH_POLL_INTERVAL_DEFAULT = 100;
#if DEBUG || TESTBED
            public static readonly string WASH_POLL_INTERVAL = "WashPollInterval";
            public static readonly bool WASH_POLL_INTERVAL_GP = true;
#endif

            public static readonly bool WASH_POLL_MOUSE_DEFAULT = true;
#if DEBUG || TESTBED
            public static readonly string WASH_POLL_MOUSE = "WashPollMouse";
            public static readonly bool WASH_POLL_MOUSE_GP = true;
#endif

            //             public static readonly int    WASH_DISABLE_CLICKTEXT_DEFAULT = false;
            // #if DEBUG || TESTBED
            //             public static readonly string WASH_DISABLE_CLICKTEXT = "WashDisableClicktext";
            //             public static readonly bool   WASH_DISABLE_CLICKTEXT_GP = true;
            // #endif

            public static readonly bool WASH_FAST_SAMPLE_DEFAULT = true; // but ignored on XP
#if DEBUG || TESTBED
            public static readonly string WASH_FAST_SAMPLE = "WashFastSample";
            public static readonly bool WASH_FAST_SAMPLE_GP = true;
#endif

            public static readonly bool WASH_POLL_CONSOLES_DEFAULT = true;
#if DEBUG || TESTBED
            public static readonly string WASH_POLL_CONSOLES = "WashPollConsoles";
            public static readonly bool WASH_POLL_CONSOLES_GP = true;
#endif

            public static readonly bool WASH_ENABLE_COPY_RECT_DEFAULT = true;
#if DEBUG || TESTBED
            public static readonly string WASH_ENABLE_COPY_RECT = "WashEnableCopyRect";
            public static readonly bool WASH_ENABLE_COPY_RECT_GP = true;
#endif

            public static readonly int WASH_DIFF_METHOD_DEFAULT = 2; // 0 == None, 1 == FullRect, 2 == BlockedRect
#if DEBUG || TESTBED
            public static readonly string WASH_DIFF_METHOD = "WashDiffMethod";
            public static readonly bool WASH_DIFF_METHOD_GP = true;
#endif

            public static readonly int FRAME_INTERVAL_DEFAULT = 50; // msecs
#if DEBUG || TESTBED
            public static readonly string FRAME_INTERVAL = "FrameInterval";
            public static readonly bool FRAME_INTERVAL_GP = true;
#endif

            public static readonly bool WDAD_COMPRESSION_DEFAULT = true;
#if DEBUG || TESTBED
            public static readonly string WDAD_COMPRESSION = "WdadCompression";
            public static readonly bool WDAD_COMPRESSION_GP = true;
#endif

#if DEBUG || TESTBED
            public static readonly string RFB_CLIENT_HOST = "RfbClientHost";
            public static readonly string RFB_CLIENT_HOST_DEFAULT = string.Empty;
            public static readonly bool RFB_CLIENT_HOST_GP = false;

            public static readonly string RFB_CLIENT_PORT = "RfbClientPort";
            public static readonly int RFB_CLIENT_PORT_DEFAULT = 5500;
            public static readonly bool RFB_CLIENT_PORT_GP = false;

            public static readonly string NO_DELAY_BEFORE_IFRAME = "NoDelayBeforeIframe";
            public static readonly bool NO_DELAY_BEFORE_IFRAME_DEFAULT = true;
            public static readonly bool NO_DELAY_BEFORE_IFRAME_GP = true;
#endif

#if DEBUG
            public static readonly string WAIT_FOR_DEBUGGER = "WaitForDebugger";
            public static readonly bool WAIT_FOR_DEBUGGER_DEFAULT = false;
            public static readonly bool WAIT_FOR_DEBUGGER_GP = true;

            public static readonly string CLOSE_CONSOLE = "CloseConsole";
            public static readonly bool CLOSE_CONSOLE_DEFAULT = true;
            public static readonly bool CLOSE_CONSOLE_GP = true;

            public static readonly string EXCLUDED_SESSIONS = "ExcludedSessions";
            public static readonly bool EXCLUDED_SESSIONS_GP = false;
            public static readonly string EXCLUDED_SESSIONS_DEFAULT = string.Empty;

            public static readonly string AUTO_WASH = "AutoWash";
            public static readonly bool AUTO_WASH_DEFAULT = true;
            public static readonly bool AUTO_WASH_GP = true;
#endif

        }

        public class Console
        {
            // All are 'user' registry entries.

            public static readonly string CONSOLE_KEY = PRODUCT_NAME;

            public static readonly string LOG_LEVEL = "LogLevel";
            public static readonly SourceLevels LOG_LEVEL_DEFAULT = SourceLevels.Warning;
            public static readonly bool LOG_LEVEL_GP = false;

            public static readonly string LOG_DIRECTORY = "LogDirectory";
            public static readonly string LOG_DIRECTORY_DEFAULT = Path.Combine(
                Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData),
                "Centrify\\DirectAudit\\Log");
            public static readonly bool LOG_DIRECTORY_GP = false;

            public static readonly string DOMAIN_CONTROLLER = "DomainController";
            public static readonly string DOMAIN_CONTROLLER_DEFAULT = string.Empty;
            public static readonly bool DOMAIN_CONTROLLER_GP = false;

            public static readonly string DATABASE_NAME = "DatabaseName";
            public static readonly string DATABASE_NAME_DEFAULT = string.Empty;
            public static readonly bool DATABASE_NAME_GP = false;

            public static readonly string SERVER_NAME = "ServerName";
            public static readonly string SERVER_NAME_DEFAULT = string.Empty;
            public static readonly bool SERVER_NAME_GP = false;

            public static readonly string UPDATE_INTERVAL = "UpdateInterval"; // for replayer.  msecs.
            public static readonly int UPDATE_INTERVAL_DEFAULT = 50;
            public static readonly bool UPDATE_INTERVAL_GP = true;

            // Replayer frame buffer size.  Default is 2000.  It should be okay because Unix should
            // always have a snapshot every 2000 frames.
            public static readonly string FRAME_BUFFER_SIZE = "FrameBufferSize";
            public static readonly int FRAME_BUFFER_SIZE_DEFAULT = 2000;
            public static readonly bool FRAME_BUFFER_SIZE_GP = true;

            public static readonly string FRAME_BUFFER_SIZE_WIN = "FrameBufferSizeWindows";
            public static readonly int FRAME_BUFFER_SIZE_WIN_DEFAULT = 1300;

            public static readonly string MARK_EXCEPTIONS_HANDLED = "MarkExceptionsHandled";
            public static readonly bool MARK_EXCEPTIONS_HANDLED_DEFAULT = true;
            public static readonly bool MARK_EXCEPTIONS_HANDLED_GP = true;
        }

        public class CentrifyCommon
        {
            // Note: unlike other keys, these are relative to SOFTWARE, not SOFTWARE\Centrify.
            public static readonly string COMMON_DA = "Centrify DA";
            public static readonly string COMMON_DA_KEY = Path.Combine(CentrifyCommonSettings.CENTRIFY_COMMON_KEY, COMMON_DA);
            public static readonly string COMMON_DA_REG_KEY = Path.Combine(CentrifyCommonSettings.SOFTWARE, COMMON_DA_KEY);

            public static readonly string LOG_FILE = "LogFile";
            public static readonly string LOG_FILE_DEFAULT = string.Empty;
            public static readonly bool LOG_FILE_GP = false;

            public static readonly string LOG_DIRECTORY = "LogDirectory";
            public static readonly string LOG_DIRECTORY_DEFAULT = "c:\\Logs";
            public static readonly bool LOG_DIRECTORY_GP = false;
        }

        public class Common
        {
            public static readonly string COMMON_NAME = "Common";

            public static readonly string COMMON_KEY = Path.Combine(PRODUCT_NAME, COMMON_NAME);

            public static readonly string COMMON_POLICIES_REG_KEY = Path.Combine(DIRECT_AUDIT_POLICIES_REG_KEY,
                                                                    COMMON_NAME);

            public static readonly string SCP_LOCATION = "ScpLocation";
            public static readonly string SCP_LOCATION_DEFAULT = string.Empty;
            public static readonly bool SCP_LOCATION_GP = false;

            public static readonly string DATABASE_NAME = "DatabaseName";
            public static readonly string DATABASE_NAME_DEFAULT = string.Empty;
            public static readonly bool DATABASE_NAME_GP = false;

            public static readonly string SERVER_NAME = "ServerName";
            public static readonly string SERVER_NAME_DEFAULT = string.Empty;
            public static readonly bool SERVER_NAME_GP = false;

            public static readonly string INSTALLATION_GUID = "InstallationGuid";
            public static readonly string INSTALLATION_GUID_DEFAULT = null;
            public static readonly bool INSTALLATION_GUID_GP = true;

            public static readonly string COMMAND_TIMEOUT = "CommandTimeout";
            public static readonly int COMMAND_TIMEOUT_DEFAULT = 0;
            public static readonly bool COMMAND_TIMEOUT_GP = true;

            public static readonly string SHOW_LICENSE_USAGE_WARNING = "ShowLicenseUsageWarning";
            public static readonly bool SHOW_LICENSE_USAGE_WARNING_DEFAULT = true;
            public static readonly bool SHOW_LICENSE_USAGE_WARNING_GP = false;

            public static readonly string SHOW_NON_FIPS_LICENSE_WARNING = "ShowNonFipsLicenseWarning";
            public static readonly bool SHOW_NON_FIPS_LICENSE_WARNING_DEFAULT = true;
            public static readonly bool SHOW_NON_FIPS_LICENSE_WARNING_GP = false;

            public static readonly string INSTALL_DIR = "InstallDir";
            public static readonly string INSTALL_DIR_DEFAULT = string.Empty;
            public static readonly bool INSTALL_DIR_GP = false;
        }

        public class SmokeTest
        {
            public static readonly string SMOKETEST_NAME = "SmokeTest";
            public static readonly string SMOKETEST_KEY = Path.Combine(PRODUCT_NAME, SMOKETEST_NAME);

            public static readonly string LOG_LEVEL = "LogLevel";
            public static readonly string LOG_LEVEL_DEFAULT = "Verbose";
            public static readonly bool LOG_LEVEL_GP = true;

            public static readonly string DATA_SOURCE = "DataSource";
            public static readonly string DATA_SOURCE_DEFAULT = @"Data Source=HATTER-WIN.RICHL.DEV\DIRECTAUDIT;Initial Catalog=DirectAudit;Integrated Security=True";
            public static readonly bool DATA_SOURCE_GP = false;

        }

        public class MirageMon
        {
            public static readonly string MIRAGEMON_NAME = "MirageMon";
            public static readonly string MIRAGEMON_KEY = Path.Combine(PRODUCT_NAME, MIRAGEMON_NAME);

            public static readonly string LOG_LEVEL = "LogLevel";
            public static readonly string LOG_LEVEL_DEFAULT = "Verbose";
            public static readonly bool LOG_LEVEL_GP = true;

            public static readonly string DATA_SOURCE = "DataSource";
            public static readonly string DATA_SOURCE_DEFAULT = "";
            public static readonly bool DATA_SOURCE_GP = false;

            public static readonly string SAMPLE_INTERVAL = "SampleInterval";
            public static readonly int SAMPLE_INTERVAL_DEFAULT = 15;
            public static readonly bool SAMPLE_INTERVAL_GP = false;

            public static readonly string UPDATE_INTERVAL = "UpdateInterval";
            public static readonly int UPDATE_INTERVAL_DEFAULT = 120;
            public static readonly bool UPDATE_INTERVAL_GP = false;

            public static readonly string COMPUTERS = "Computers";
            public static readonly string COMPUTERS_DEFAULT = string.Empty;
            public static readonly bool COMPUTERS_GP = false;
        }

        public class SessionDiag
        {
            public static readonly string SESSION_DIAG_KEY = PRODUCT_NAME;

            public static readonly string SITE_DB = "SiteDbString";
            public static readonly string SITE_DB_DEFAULT = "";
            public static readonly bool SITE_DB_GP = false;
        }

        public class WdadSim
        {
            public static readonly string WDAD_SIM_KEY = PRODUCT_NAME;

            public static readonly string CDF_FILE = "WdadSimCdfFile";
            public static readonly string CDF_FILE_DEFAULT = "session.cdf";
            public static readonly bool CDF_FILE_GP = true;

            public static readonly string THREADS = "WdadSimThreads";
            public static readonly int THREADS_DEFAULT = 2;
            public static readonly bool THREADS_GP = true;

            public static readonly string SPOOL = "WdadSimSpool";
            public static readonly string SPOOL_DEFAULT = "c:\\spool";
            public static readonly bool SPOOL_GP = true;
        }
    }
}
